#include <lib_timer.h>

static	volatile u16	UserTimer=0;
static 	volatile u16	UserTimer_counter;
static 	volatile u16	TimerModbus35Orig;
static	volatile u16	TimerModbus35=FALSE;
static 	volatile u16	TimerModbus35_counter;

void TimerModbusSet(register u16 t35) {
	CRITICAL_SECTION_START;
	TimerModbus35Orig=t35;
	CRITICAL_SECTION_END;
}

void TimerInit  (void) {
    // Calculate overflow counter an OCR values for Timer1.
    //usTimerOCRADelta = ( MB_TIMER_TICKS * usTim1Timerout50us ) / ( MB_50US_TICKS );
#if defined (__AVR_ATmega88__)
    TCCR0A = 0;
    TCCR0B = 0;
#else
    TCCR0 = 0;
#endif
    TimerModbus35=FALSE;
    TimerDisable();
    return;
}

void TimerEnable() {
   	TCNT0 = 0;			//	обнуляем счетчик
#if defined (__AVR_ATmega88__)
   	OCR0A = 221;		//	предел срабатывания таймера
   	sbi(TCCR0B,CS00);	//	делитель =1
   	sbi(TCCR0A,WGM01);	//	режим CTC
   	sbi(TIMSK0,OCIE0A);	//	прерывание по OCR0A
//#endif
//#if defined (__AVR_ATmega16__)
#else
   	OCR0 = 146;		//	предел срабатывания таймера 50000 Hz (147.46)
   	sbi(TCCR0,CS00);	//	делитель =1
   	sbi(TCCR0,WGM01);	//	режим CTC
   	sbi(TIMSK,OCIE0);	//	прерывание по OCR0
   	//sbi(TIFR,OCF0);
#endif
   	//TCCR1B |= _BV( CS12 ) | _BV( CS10 );
   	return;
}

void TimerDisable() {
    /* Disable the timer. */
	//cbi(TCCR0B,CS00);
	/* Disable the output compare interrupts for channel A/B. */
	//sbi(TIMSK0,OCIE0A);
    // Clear output compare flags for channel A/B.
#if defined (__AVR_ATmega88__)
	sbi(TIFR0,OCF0A);
//#endif
//#if defined (__AVR_ATmega16__)
#else
	cbi(TIFR,OCF0);
#endif
    return;
}

#if defined (__AVR_ATmega88__)
ISR( TIMER0_COMPA_vect ) {
#else
ISR( TIMER0_COMP_vect ) {
#endif
	if (TimerModbus35) {
		if (!--TimerModbus35_counter) {
			TimerModbus35_counter=TimerModbus35;
			SerialTimer35Expired();
		}
	}
	if (UserTimer) {
		if (!--UserTimer_counter) {
			UserTimer_counter=UserTimer;
			//...
		}
	}
}


